package com.syyo.gulimall.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 *     买家账号  hemqst7845@sandbox.com
 *
 *     事物
 *     传播行为
 *     Propagation
 *        REQUIRED  共用一个事物
 *        REQUIRES_NEW 使用一个新的事物
 *
 * 	本地事物失效问题：
 * 		同一个对象的事物方法，默认是用第一次的事物方法，其他事物方法会失效，原因绕过了代理对象
 * 	解决方法：使用代理对象来调事物方法
 * 		1.引入aop代理对象 spring-boot-starter-aop
 * 		2.（默认动态代理是jdk，需要接口才能创建动态代理）
 * 		@EnableAspectJAutoProxy(exposeProxy = true) 对外暴露代理对象
 * 		开启aspectj动态代理，没有接口也可以创建动态代理
 *		3.用代理对象调用
 *			OrderServiceImpl proxy = (OrderServiceImpl) AopContext.currentProxy();
 *			proxy.b();// 使用代理对象调用，b() c()方法的事物设置才生效
 *			proxy.c();
 *
 *
 *  使用seata来控制分布式事物
 *  1）、每一个微服务先创建undo_log 表
 *  2）、安装seata服务器
 *  	https://github.com/seata/seata/releases,下载服务器软件包，将其解压缩。
 *  3）、整合
 *  	1、导入依赖 spring-cloud-starter-alibaba-seata
 *  	2、解压并启动seata-server
 *  		registry.conf:注册中心配置
 *  		file.conf:文件类型配置的配置文件
 *      3、所有想用到分布式事物的微服务，都要配置使用seata的代理数据源
 *      	@Autowired
 *    		DataSourceProperties dataSourceProperties;// 数据源的配置类
 *    	 	@Bean
 *     		public DataSource dataSource(DataSourceProperties properties){
 *         		// properties.initializeDataSourceBuilder().type(type).build();
 *         		HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
 *         		if (StringUtils.hasText(properties.getName())) {
 *             		dataSource.setPoolName(properties.getName());
 *         		}
 *         		return new DataSourceProxy(dataSource);
 *    	 	}
 *    	4、每个要用分布式的微服务要导入噢配置文件
 *    		file.conf   registry.conf
 *
 *		5、启动测试
 *		6、给事务的入口方法，加上 @GlobalTransactional  所有的远程小事务加上 @Transactional
 *
 *
 *
 *
 *
 *
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession // 开启redis的sesion共享
@EnableDiscoveryClient
@MapperScan("com.syyo.gulimall.order.mapper")
@SpringBootApplication
public class GulimallOrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(GulimallOrderApplication.class, args);

		System.out.println(
				"       启动成功                   \n" +
						"    '----'        ||      //      \n" +
						"  //      \\\\      ||    //        \n" +
						" ||        ||     ||   //         \n" +
						" ||        ||     ||   \\\\         \n" +
						"  \\\\      //      ||    \\\\        \n" +
						"    '----'        ||      \\\\      ");
	}

}
